package com.wtwd.campus.utils;


/**
 * @author mjy
 * @date 2022/11/08
 * @description
 */
public class RegionUtil {

    /**
     * 返回一个点是否在一个多边形区域内（包括多边形边界上）
     * 采用单边射线法，向右做水平射线，若交点为奇数则在多边形内
     */
    public static boolean isPolygonContainsPoint(Double[] polyX, Double[] polyY, int size, Double x, Double y) {
        int intersectCount = 0;
        for (int i = 0; i < size; i++) {
            int j = (i + 1) % size;
            double x1 = polyX[i];
            double y1 = polyY[i];
            double x2 = polyX[j];
            double y2 = polyY[j];
            // 取多边形任意一个边,做点的水平延长线,求解与当前边的交点个数
            if (y1 == y2) { // 边是水平线段,要么没有交点,要么有无限个交点
                if ((y == y1) && (x >= Math.min(x1, x2) && x <= Math.max(x1, x2))) {
                    // 点在边上
                    return true;
                }
            }
            // 没有交点(点在边下 或 点在边上 )
            if (y < Math.min(y1, y2) || y >= Math.max(y1, y2)) {
                continue;
            }
            // 求解交点（相似三角形）
            double intersect = (y - y1) * (x2 - x1) / (y2 - y1) + x1;
            if (intersect == x) {
                //点在边上
                return true;
            }
            if (intersect > x) {
                // 右相交
                intersectCount++;
            }
        }
        return intersectCount % 2 == 1;
    }


   /* public static void main(String[] args) {
        Double[] lat = {39.920255, 39.897555, 39.892353, 39.891365};
        Double[] lng = {116.403322, 116.410703, 116.402292, 116.389846};
        boolean inPolygon = isPolygonContainsPoint();
        System.out.println(inPolygon);
    }*/
}
